package com.scs.application.modules.dept.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.scs.application.core.exception.BusinessException;
import com.scs.application.core.service.BaseServiceImpl;
import com.scs.application.modules.base.entity.PackTemplet;
import com.scs.application.modules.base.entity.PackTempletItem;
import com.scs.application.modules.base.service.PackTempletItemService;
import com.scs.application.modules.base.service.PackTempletService;
import com.scs.application.modules.dept.dto.OprtApplyPackDTO;
import com.scs.application.modules.dept.entity.OprtApplyItem;
import com.scs.application.modules.dept.mapper.OprtApplyItemMapper;
import com.scs.application.modules.dept.service.OprtApplyItemService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 */
@Service
public class OprtApplyItemServiceImpl extends BaseServiceImpl<OprtApplyItemMapper, OprtApplyItem> implements OprtApplyItemService {

    @Autowired
    private PackTempletItemService packTempletItemService;

    @Autowired
    private PackTempletService packTempletService;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean addByTemp(OprtApplyPackDTO oprtApplyPackDTO) {
        if (StringUtils.isBlank(oprtApplyPackDTO.getOprtApplyId())) {
            throw new BusinessException("主单信息未保存，请检查！");
        }
        if (oprtApplyPackDTO.getPackTemplets() == null || oprtApplyPackDTO.getPackTemplets().size() == 0) {
            throw new BusinessException("没有选择任何模板");
        }

        List<String> packTempletIds = oprtApplyPackDTO.getPackTemplets().stream().map(item -> item.getId()).collect(Collectors.toList());
        List<PackTemplet> packTemplets = packTempletService.list(new QueryWrapper<PackTemplet>().in("id", packTempletIds));
        List<OprtApplyItem> oprtApplyItemList = new ArrayList<>();
        packTemplets.forEach(item->{
//            OprtApplyItem oprtApplyPack = new OprtApplyItem();
//            oprtApplyPack.setOprtApplyId(oprtApplyPackDTO.getOprtApplyId());
//            oprtApplyPack.setSupplierId(StringUtils.isBlank(item.getSupplierId()) ? "0" : item.getSupplierId());
//            oprtApplyPack.setSupplierName(StringUtils.isBlank(item.getSupplierName()) ? "无" : item.getSupplierName());
//            oprtApplyPack.setMatrName(item.getName());//名称
//            oprtApplyPack.setPackId(item.getId());
//            oprtApplyPack.setMatrType("1");//跟台包
//            oprtApplyPack.setMatrId("-1");//跟台包默认耗材id为-1
//            oprtApplyPack.setMatrSpec("均型");
//            oprtApplyPack.setPackageUnit("包");
//            oprtApplyPack.setPackageQty(1.0);
//            oprtApplyPack.setSkuPrice(item.getAmount());
//            oprtApplyPack.setSkuQty(1.0);
//            oprtApplyPack.setSkuUnit("包");
//            oprtApplyPack.setPackageUnit("包");
//            oprtApplyPack.setStatus(0);
//            boolean success = this.save(oprtApplyPack);
            //根据模板主表id查询所有明细表
//            String packApplyItemId = oprtApplyPack.getId();
            List<PackTempletItem> packTempletItems = packTempletItemService.list(new QueryWrapper<PackTempletItem>().eq("pack_templet_id", item.getId()));
            if (CollectionUtils.isEmpty(packTempletItems)) {
                throw new BusinessException("【%s】内未维护耗材，请联系管理员维护包模板！",item.getName());
            }
            packTempletItems.stream().forEach(packTempletItem->{
                OprtApplyItem oprtApplyMatr = new OprtApplyItem();
                BeanUtils.copyProperties(packTempletItem, oprtApplyMatr);
                oprtApplyMatr.setId(null);
                oprtApplyMatr.setPackApplyItemId(null);
                oprtApplyMatr.setOprtApplyId(oprtApplyPackDTO.getOprtApplyId());

                oprtApplyMatr.setSkuPrice(packTempletItem.getSkuPrice());
                oprtApplyMatr.setSkuUnit(packTempletItem.getSkuUnit());
                oprtApplyMatr.setPackageRate(packTempletItem.getPackageRate());
                if (packTempletItem.getSkuQty()==0){
                    oprtApplyMatr.setSkuPrice(packTempletItem.getAmount());
                }else {
                    oprtApplyMatr.setSkuPrice(packTempletItem.getAmount()/ packTempletItem.getSkuQty());  //价格
                }
                oprtApplyMatr.setStatus(0);
                oprtApplyItemList.add(oprtApplyMatr);
            });
        });
        if (CollectionUtils.isEmpty(oprtApplyItemList)) {
            throw new BusinessException("模板包内未维护耗材，请联系管理员维护包模板！");
        }
        return super.saveOrUpdateBatch(oprtApplyItemList);
    }

    @Override
    public boolean saveOrUpdate(OprtApplyItem entity) {
        super.saveOrUpdate(entity);
        // 修改的是包
        if ("1".equals(entity.getMatrType())) {

            // 包明细配置
            List<PackTempletItem> packTempletItem = packTempletItemService.list(new QueryWrapper<PackTempletItem>().eq("pack_templet_id", entity.getPackId()));
            if (packTempletItem != null && packTempletItem.size() > 0) {
                Map<String,List<PackTempletItem>> packTempletItemGroupByMatrId = packTempletItem.stream()
                        .collect(Collectors.groupingBy(PackTempletItem::getMatrId));
                //包对应的入库明细, 重新计算包内耗材数量及金额
                List<OprtApplyItem> itemList = this.list(Wrappers.<OprtApplyItem>query().eq("pack_apply_item_id",entity.getId()).isNotNull("pack_apply_item_id"));
                if (itemList != null && itemList.size() > 0) {
                    for(OprtApplyItem itemDtl : itemList) {
                        if (packTempletItemGroupByMatrId.containsKey(itemDtl.getMatrId())) {
                            itemDtl.setPackageQty(packTempletItemGroupByMatrId.get(itemDtl.getMatrId()).get(0).getPackageQty() * entity.getPackageQty());
                            itemDtl.setSkuQty(itemDtl.getPackageRate() * itemDtl.getPackageQty());
                            itemDtl.setAmount(itemDtl.getSkuQty() * itemDtl.getSkuPrice());
                        }
                    }
                    this.updateBatchById(itemList);
                }
            }
        }
        return true;
    }


    @Override
    public boolean removeCascadeByIds(Collection<? extends Serializable> idList) {
        super.removeCascadeByIds(idList);
        // 删除对应的包明细
        this.remove(Wrappers.<OprtApplyItem>query().in("pack_apply_item_id",idList).isNotNull("pack_apply_item_id"));
        return true;
    }
}
